package com.order.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cloud.domain.TbOrder;
import com.cloud.domain.TbUser;
import com.order.dao.OrderMapper;
import com.order.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @version 1.0
 * @author: yu.tan
 * @date: 2020/10/12 22:38
 * @Description:
 */
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Override
    public List<TbOrder> testCache() {
        QueryWrapper<TbOrder> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id", 1);
        orderMapper.selectList(queryWrapper);
        return orderMapper.selectList(queryWrapper);
    }

    @Override
    public List<TbOrder> testCache2() {
        return null;
    }

    /**
     * 为什么开启事务
     * 由于使用了数据库连接池，默认每次查询完之后自动commite，这就导致两次查询使用的不是同一个sqlSessioin，根据一级缓存的原理，它将永远不会生效。
     * 当我们开启了事务，两次查询都在同一个sqlSession中，从而让第二次查询命中了一级缓存。读者可以自行关闭事务验证此结论。
     *
     * 两种一级缓存模式
     * 一级缓存的作用域有两种：session（默认）和statment，可通过设置local-cache-scope 的值来切换，默认为session。
     * 二者的区别在于session会将缓存作用于同一个sqlSesson，而statment仅针对一次查询，所以，local-cache-scope: statment可以理解为关闭一级缓存。
     * @return
     */
    @Transactional
    @Override
    public TbOrder testCache1() {
        TbOrder tbOrder = orderMapper.selectById(1);
        System.out.println(tbOrder);
        return orderMapper.selectById(1);
    }
}
